// 项目中 一般有全局枚举文件和局部模块枚举文件  以全局枚举为例若有个文件里的内容是这样的  最佳实践该如何实现

//一般项目中应统用一种方式，数组or对象
const AllEnum = {
  sexEnum: [
    { label: '♂', value: 1 },
    { label: '♀', value: 0 }
  ],
  statusEnum: {
    fail: '失败',
    success: '成功',
  }
}

export default AllEnum


import AllEnum from '枚举文件路劲'
// const {sexEnum,statusEnum} = AllEnum
<>
  //Array sexEnum
  <Select options={sexEnum} />
  //Object statusEnum 可二次封装传对象
  <Select>
    {Object.keys(statusEnum || {}).map(item => {
      return (
        <Select.Option value={item} key={item}>
          {statusEnum[item]}
        </Select.Option>
      )
    })}
  </Select>
</>
// 控件上回显就不说了,根据value自动回显,页面上回显方式:
const getLabel = (enumVal, value) => {
  //判断条件就不写了
  if ('isArray') return enumVal.find(item => item.value == value)?.label
  if ('isObject') return enumVal[value]
}
即便是封装成方法也要再引入一次, 如何不引入呢 ?



  // 1. [{label,value}] 

  //默认用Array的constructor  不用判断类型 传几个参push几个参
  class EnumArray1 extends Array {
    getLabel(value) {
      return this.find(item => item.value == value)?.label
    }
  }

const res1 = new EnumArray1({ label: '♂', value: 1 }, { label: '♀', value: 0 })
console.log(res1);
console.log(res1.getLabel(1));



class EnumArray2 extends Array {
  constructor(params) {
    if (Array.isArray(params)) super(...params)
    else super()
  }
  getLabel(value) {
    return this.find(item => item.value == value)?.label
  }
}
const res2 = new EnumArray2([{ label: '♂', value: 1 }, { label: '♀', value: 0 }])

console.log(res2);
console.log(res2.getLabel(1));




